package camadaSO;

import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.ExportException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

import camadaRN.RNPartida;

public class ClienteRMI extends UnicastRemoteObject implements IServidorClienteRMI {

//	private static ClienteRMI clienteRMI = null;
	
	public ClienteRMI() throws RemoteException {
	}
		
	public boolean iniciarClienteRMI() {
        try {        	        	
        	try {
				LocateRegistry.createRegistry(1099);
			} catch (ExportException e) {
				e.printStackTrace();
			}
        	
        	ClienteRMI obj = new ClienteRMI();
        	String ipCliente = InetAddress.getLocalHost().getHostAddress();		

            Naming.rebind("//"+ipCliente+"//Cliente", obj);

            return true;
        } catch (MalformedURLException ex) {
			System.out.println( "MalformedURLException: " + ex.toString() );
        } catch (RemoteException ex) {
			System.out.println( "RemoteException: " + ex.toString() ); 
        } catch (UnknownHostException e) {
			e.printStackTrace();
		}
        return false;
    }
	
	public boolean finalizarClienteRMI() {
        try { 	
        	String ipCliente = InetAddress.getLocalHost().getHostAddress();

            Naming.unbind("//"+ipCliente+"//Cliente");

            return true;
        } catch (RemoteException ex) {
			System.out.println( "RemoteException: " + ex.toString() ); 
        } catch (NotBoundException ex) {
			System.out.println( "NotBoundException: " + ex.toString() );
        } catch (MalformedURLException ex) {
			System.out.println( "MalformedURLException: " + ex.toString() );
        } catch (UnknownHostException e) {
			e.printStackTrace();
		}
        return false;
    }

	public void passaListaPCliente(List<String> nomes,List<String> senhas,List<Integer> pontuacoes){			
		//TODO TRANSFERIR ESSA LOGICA PARA RNELITESQUADCLIENTE		
		for(String nome: nomes){
			int indice = nomes.indexOf(nome);
			camadaRN.RNUsuario usuario = new camadaRN.RNUsuario(nome,senhas.get(indice));
			usuario.setPontuacao(pontuacoes.get(indice));			
			if(!nome.equals(camadaIU.IUSala.getIUSala().getUsuario().getNome())){
				camadaRN.RNEliteSquadCliente.getRNCliente().
					getUsuariosConectados().add(usuario);
			}
			else {
				camadaRN.RNEliteSquadCliente.getRNCliente().setUsuario(usuario);

				camadaIU.IUSala.getIUSala().setUsuario(usuario);
			}
		}
		camadaIU.IUSala.getIUSala().atualizaLista();
	}
	
	public void limpaListaAtual(){
		camadaRN.RNEliteSquadCliente.getRNCliente().getUsuariosConectados().clear();
	}

	public void apresentarMensagemDesafio(String desafiante) throws RemoteException {
		camadaIU.IUSala.getIUSala().mostraMensagemDesafio(desafiante);		
	}

	public void apresentarRespostaDesafio(boolean resposta, String desafiado) throws RemoteException {
		camadaIU.IUSala.getIUSala().apresentaResposta(resposta, desafiado);
	} 
	
	public void atualizarPecasJogador(int xpeca1, int ypeca1, int xpeca2, int ypeca2,String movimento) throws java.rmi.RemoteException{
		RNPartida partida = camadaRN.RNEliteSquadCliente.getRNCliente().getUsuario().getPartida();
		
		camadaRN.RNPeca pecaAux = partida.getTabuleiro().getPeca(9-ypeca1, 9-xpeca1);
		partida.getTabuleiro().setPeca(9-ypeca1,9-xpeca1, partida.getTabuleiro().getPeca(9-ypeca2, 9-xpeca2));
		partida.getTabuleiro().setPeca(9-ypeca2, 9-xpeca2,pecaAux);
		
		camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo().atualizaTexto(movimento);
		
	}
	
	public void atualizarPecasJogadorAposCombate(int xpeca1, int ypeca1, int xpeca2, int ypeca2,String vencedor, String resultado) throws java.rmi.RemoteException{
		
		RNPartida partida = camadaRN.RNEliteSquadCliente.getRNCliente().getUsuario().getPartida();
		int pecaPerdida=partida.getTabuleiro().atualizarTabuleiroAposCombate(xpeca1,ypeca1,xpeca2, ypeca2,vencedor);
		
		camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo().atualizaTexto(resultado);
		
		if(pecaPerdida<11)
		camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo().marcaPecaPerdida(pecaPerdida);
	}
	
	public void atualizaTela(int ypeca1,int xpeca1,int ypeca2,int xpeca2)throws java.rmi.RemoteException{
		camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo().efetuarMovimentoRemoto(9-ypeca1,9-xpeca1,9-ypeca2,9-xpeca2,"");
	}

	public void habilitaTabuleiro(String adversario) throws RemoteException {
		camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo().habilitaTabuleiro(adversario);		
	}

	public void finalizaPartida(boolean ganhou) throws RemoteException {
		if(ganhou){
			camadaRN.RNEliteSquadCliente.getRNCliente().getUsuario().setPontuacao(
				camadaRN.RNEliteSquadCliente.getRNCliente().getUsuario().getPontuacao()+1);
		}else{
			camadaRN.RNEliteSquadCliente.getRNCliente().getUsuario().setPontuacao(
					camadaRN.RNEliteSquadCliente.getRNCliente().getUsuario().getPontuacao()-1);
		}		
		if(camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo()!=null){
			camadaIU.IUSala.getIUSala().getIuJogoInicial().getIuJogo().finalizaPartida(ganhou);
		}else 
			camadaIU.IUSala.getIUSala().getIuJogoInicial().finalizaPartida(ganhou);
	}
}
